using System;
using System.Collections.Generic;
using System.Text;
using WebService.BusinessEntities;
using WebService.DataAccess;

namespace WebService.BusinessLogic.Managers
{
    /// <summary>
    /// Klasa dostarczajaca funkcjonalnosci w obszarze zarzadzania
    /// znajomosciami oraz zaproszeniami uzytkownikow kasyna
    /// </summary>
    public class CasinoUsersFriendshipManager
    {
        private String database;
        /// <summary>
        /// Connection-string do bazy danych
        /// </summary>
        public String Database
        {
            get { return database; }
            set { database = value; }
        }

	    /// <summary>
	    /// Konstruktor parametrowy managera
	    /// </summary>
	    /// <param name="database">Connection-string do bazy danych</param>
        public CasinoUsersFriendshipManager(String database)
        {
            Database = database;
        }

        /// <summary>
        /// Funkcja dodaje nowe zaproszenie
        /// </summary>
        /// <param name="inv">Zaproszenie</param>
        public void InsertUserInvitation(UserInvitation inv)
        {            
            UserInvitationRepository rep = new UserInvitationRepository(database);
            rep.Add(inv);
        }

        /// <summary>
        /// Funkcja akceptuje dane zaproszenie
        /// </summary>
        /// <param name="inv">Zaproszenie</param>
        public void AcceptUserInvitation(UserInvitation inv)
        {
            UserInvitationRepository rep = new UserInvitationRepository(database);
            rep.Save(inv);
        }

        /// <summary>
        /// Funkcja usuwa dane zaproszenie
        /// </summary>
        /// <param name="inv">Zaproszenie</param>
        public void DeleteUserInvitation(UserInvitation inv)
        {
            UserInvitationRepository rep = new UserInvitationRepository(database);
            rep.Remove(inv.sent_by, inv.sent_to);
        }

        /// <summary>
        /// Funkcja usuwa pare znajowych
        /// </summary>
        /// <param name="u1">ID pierwszego uzytkownika</param>
        /// <param name="u2">ID drugiego uzytkownika</param>
        public void DeleteUsersFriends(CasinoUser u1, CasinoUser u2)
        {
            UsersFriendsRepository rep = new UsersFriendsRepository(database);
            rep.Remove(u1.user_id, u2.user_id);
        }

        /// <summary>
        /// Funkcja pobiera liste wszystkich wyslanych zaproszen
        /// </summary>
        /// <returns>Lista wszystkich zaproszen</returns>
        public List<UserInvitation> GetAllUsersInvitations()
        {
            List<UserInvitation> invs = new List<UserInvitation>();
            UserInvitationRepository rep = new UserInvitationRepository(database);
            invs = rep.GetAllUserInvitationsProc();
            return invs;
        }

        /// <summary>
        /// Funkcja pobiera wszystkie pary znajomych
        /// </summary>
        /// <returns>Lista wszystkich znajomych</returns>
        public List<UsersFriends> GetAllUsersFriends()
        {
            List<UsersFriends> friends = new List<UsersFriends>();
            UsersFriendsRepository rep = new UsersFriendsRepository(database);
            friends = rep.GetAllUsersFriends();
            return friends;
        }

        /// <summary>
        /// Funkcja pobiera liczbe zjamowych danego uzytkownika
        /// </summary>
        /// <param name="user">Uzytkownika</param>
        /// <returns>Ilosc znajomych</returns>
        public int GetCountUsersFriends(CasinoUser user)
        {
            return 0;
        }

        /// <summary>
        /// Funkcja pobiera uzytkownikow i zaproszenia, ktore zostaly wyslane
        /// przez danego uzytkownika, ale czekaja na akceptacje
        /// </summary>
        /// <param name="user">Uzytkownik nadawca</param>
        /// <returns>Lista oczekujacych zaproszen</returns>
        public List<CasinoUserInvitation> GetSentByUserActiveInvitations(CasinoUser user)
        {
            List<CasinoUserInvitation> usrinv = new List<CasinoUserInvitation>();
            CasinoUserInvitationRepository rep = new CasinoUserInvitationRepository(database);
            usrinv = rep.GetSentToUserActiveInvitaionsProc(user.user_id);
            return usrinv;
        }

        /// <summary>
        /// Funkcja pobiera uzytkownikow i zaproszenia, ktore zostaly wyslane
        /// przez danego uzytkownika
        /// </summary>
        /// <param name="user">Uzytkownik nadawca</param>
        /// <returns>Lista zaproszen</returns>
        public List<CasinoUserInvitation> GetSentByUserInvitations(CasinoUser user)
        {
            List<CasinoUserInvitation> usrinv = new List<CasinoUserInvitation>();
            CasinoUserInvitationRepository rep = new CasinoUserInvitationRepository(database);
            usrinv = rep.GetSentByUserInvitaionsProc(user.user_id);
            return usrinv;
        }

        /// <summary>
        /// Funkcja pobiera uzytkownikow i zaproszenia, ktore zostaly wyslane
        /// przez danego uzytkownika, i zostaly zaakceptowane
        /// </summary>
        /// <param name="user">Uzytkownik nadawca</param>
        /// <returns>Lista zaakceptowanych zaproszen</returns>
        public List<CasinoUserInvitation> GetSentByUsersFriends(CasinoUser user)
        {
            List<CasinoUserInvitation> usrinv = new List<CasinoUserInvitation>();
            CasinoUserInvitationRepository rep = new CasinoUserInvitationRepository(database);
            usrinv = rep.GetSentByUsersFriendsProc(user.user_id);
            return usrinv;
        }

        /// <summary>
        /// Funkcja pobiera uzytkownikow i zaproszenia, ktorzy wyslali
        /// do danego uzytkownika, ale czekaja na akceptacje
        /// </summary>
        /// <param name="user">Uzytkownik odbiorca</param>
        /// <returns>Lista oczekujacych zaproszen</returns>
        public List<CasinoUserInvitation> GetSentToUserActiveInvitations(CasinoUser user)
        {
            List<CasinoUserInvitation> usrinv = new List<CasinoUserInvitation>();
            CasinoUserInvitationRepository rep = new CasinoUserInvitationRepository(database);
            usrinv = rep.GetSentToUserActiveInvitaionsProc(user.user_id);
            return usrinv;
        }

        /// <summary>
        /// Funkcja pobiera uzytkownikow i zaproszenia, ktorzy wyslali
        /// do danego uzytkownika
        /// </summary>
        /// <param name="user">Uzytkownik odbiorca</param>
        /// <returns>Lista zaproszen</returns>
        public List<CasinoUserInvitation> GetSentToUserInvitations(CasinoUser user)
        {
            List<CasinoUserInvitation> usrinv = new List<CasinoUserInvitation>();
            CasinoUserInvitationRepository rep = new CasinoUserInvitationRepository(database);
            usrinv = rep.GetSentToUserInvitaionsProc(user.user_id);
            return usrinv;
        }

        /// <summary>
        /// Funkcja pobiera uzytkownikow i zaproszenia, ktorzy wyslali
        /// do danego uzytkownika, i zostaly zaakceptowane
        /// </summary>
        /// <param name="user">Uzytkownik nadawca</param>
        /// <returns>Lista zaakceptowanych zaproszen</returns>
        public List<CasinoUserInvitation> GetSentToUsersFriends(CasinoUser user)
        {
            List<CasinoUserInvitation> usrinv = new List<CasinoUserInvitation>();
            CasinoUserInvitationRepository rep = new CasinoUserInvitationRepository(database);
            usrinv = rep.GetSentToUsersFriendsProc(user.user_id);
            return usrinv;
        }
    }
}
